from functools import wraps
from flask import abort, request, jsonify, session, current_app
from flask_login import login_required, current_user
from applications.common.admin_log import admin_log


def authorize(power: str, log: bool = False):
    """用户权限判断，用于判断目前会话用户是否拥有访问权限

    :param power: 权限标识
    :type power: str
    :param log: 是否记录日志, defaults to False
    :type log: bool, optional
    """
    def decorator(func):
        """
        自定义装饰器，用于检查用户是否具有特定权限。

        参数:
        - func: 待装饰的函数

        返回:
        - wrapper: 包装函数，用于执行权限检查逻辑
        """
        @login_required  # 确保用户已登录
        @wraps(func)  # 保留原函数的元数据
        def wrapper(*args, **kwargs):
            # 定义管理员的id为1
            # 检查当前用户是否为超级管理员
            if current_user.username == current_app.config.get("SUPERADMIN"):
                return func(*args, **kwargs)

            # 检查请求中所需的权限是否在当前会话的权限列表中
            if not power in session.get('permissions'):
                # 如果未找到所需权限，记录访问日志（如果启用了日志功能）
                if log:
                    admin_log(request=request, is_access=False)

                # 根据请求类型处理无权限访问
                if request.method == 'GET':
                    abort(403)  # 终止GET请求，返回403错误码
                else:
                    return jsonify(success=False, msg="权限不足!")  # 返回权限不足的JSON响应

            # 如果请求被允许，记录访问日志（如果启用了日志功能）
            if log:
                admin_log(request=request, is_access=True)

            # 权限验证通过，执行原函数
            return func(*args, **kwargs)

        return wrapper


    return decorator
